<?php defined('SYSPATH') or die('No direct script access.') ;
/**
 * 管理员数据模型
 *
 * @author  Yellow.Chow <aultoale@gmail.com>
 * @version $Id: manager.php 289 2012-07-03 09:42:28Z yellow.chow $
 * @license http://www.gnu.org/licenses/gpl-3.0.html    GPL 3
 */
class Model_Manager extends Model
{

    /**
     * 获取所有管理员列表
     *
     * @return array
     */
    public function all()
    {
        return DB::select(
                    'role.role_id', 'role.role_name',
                    'mem.member_id', 'mem.email', 'mem.nickname', 'mem.reg_time',
                    'mem.reg_ip', 'mem.last_time', 'mem.last_ip', 'mem.status'
                )
                ->from(array('manager_roles', 'role'))
                ->join(array('managers', 'man'), 'INNER')
                ->on('man.role_id', '=', 'role.role_id')
                ->join(array('members', 'mem'), 'INNER')
                ->on('mem.member_id', '=', 'man.member_id')
                ->fetch_all();
    }

    /**
     * 获取管理员信息
     *
     * @param  string|int  $field
     * @param  string|int  $value
     * @return array
     */
    public function get($field, $value)
    {
        return DB::select(
                'man.role_id', 'mem.member_id', 'mem.email', 'mem.nickname', 'mem.status'
            )
            ->from(array('members', 'mem'))
            ->join(array('managers', 'man'), 'LEFT')
            ->on('mem.member_id', '=', 'man.member_id')
            ->where('mem.'.$field, '=', $value)
            ->fetch_row();
    }

    /**
     * 添加管理
     *
     * @param  string  $account
     * @param  int     $role_id
     * @return bool
     */
    public function add($account, $role_id)
    {
        if (empty($account))
        {
            return $this->error('account', 'not_empty');
        }

        if (Valid::email($account) OR $account == 'admin')
        {
            $email = $account;
        }
        elseif (preg_match('#[^\s]+\s<(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)>#', $account, $matches))
        {
            $email = $matches[1];
        }

        if (isset($email))
        {
            $member = $this->get('email', $email);
        }
        else
        {
            $member = $this->get('nickname', $account);
        }

        if ( ! $member)
        {
            return $this->error('account', 'not_found');
        }

        if ($member['role_id'])
        {
            return $this->error('account', 'is_admin');
        }

        $data = array(
            'role_id' => $role_id,
            'nickname' => $member['nickname'],
            'status' => $member['status'],
        );

        return $this->edit($member['member_id'], $data);
    }

    /**
     * 编辑管理员信息
     *
     * @param  int   $member_id
     * @param  array $data
     * @return bool
     */
    public function edit($member_id, array $data)
    {
        $member = $this->get('member_id', $member_id);

        if ( ! $member)
        {
            return $this->error('account', 'not_found');
        }

        $v = Validation::factory($data)
            ->rule('role_id', 'range', array(':value', 1, 99999))
            ->rule('role_id', array($this, 'role_exists'), array(':value'))
            ->rule('password', 'min_length', array(':value', '6'))
            ->rule('confirm', 'matches', array(':validation', ':field', 'password'))
            ->rule('nickname', 'not_empty')
            ->rule('nickname', 'min_length', array(':value', '2'))
            ->rule('nickname', 'max_length', array(':value', '20'))
            ->rule('nickname', 'regex', array(':value', '/^[^\'\"\:;,\<\>\?\/\\\*\=\+\{\}\[\]\)\(\^%\$#\!`\s]+$/'))
            ->rule('nickname', array($this, 'nick_unique'), array(':value', $member_id))
            ->rule('status', 'not_empty')
            ->rule('status', 'range', array(':value', -1, 1));
        $this->validation($v);
        if ( ! $v->check() OR ! empty($this->_errors))
        {
            return FALSE;
        }

        $set = array (
            'nickname' => $v->nickname,
            'status' => (int) $v->status,
        );

        // 修改密码
        if ($v->password)
        {
            $set['password'] = Password::create($v->password);
        }

        // 更新会员信息
        DB::update('members', $set)
            ->where('member_id', '=', $member_id)
            ->execute();

        // 删除已有的数据
        DB::delete('managers')
            ->where('member_id', '=', $member_id)
            ->execute();

        // 更新/写入数据
        $data = array(
            'member_id' => $member_id,
            'role_id' => $v->role_id,
        );
        DB::insert('managers', $data)->execute();

        // 重新加载权限
        Manager::instance()->refresh();

        return TRUE;
    }

    /**
     * 删除管理员
     *
     * @param  int  $member_id
     * @return bool
     */
    public function del($member_id)
    {
        if ($member_id == 1)
        {
            return $this->error('delete', 'admin');
        }

        if ($member_id == $this->auth->member_id)
        {
            return $this->error('delete', 'self');
        }

        // 删除数据
        DB::delete('managers')
            ->where('member_id', '=', $member_id)
            ->execute();

        // 重新加载权限
        Manager::instance()->refresh();

        return TRUE;
    }

    /**
     * 检测昵称是否重复
     *
     * @param  string  $nickname
     * @param  int     $member_id
     * @return bool
     */
    public function nick_unique($nickname, $member_id)
    {
        return ! (bool) DB::select()
            ->from('members')
            ->where('nickname', '=', $nickname)
            ->where('member_id', '<>', $member_id)
            ->count_all();
    }

    /**
     * 检查角色 ID 是否存在
     *
     * @param  int  $role_id
     * @return array
     */
    public function role_exists($role_id)
    {
        return (bool) Model::factory('manager_role')->get($role_id);
    }

    /**
     * 查找与关键词相似的会员
     *
     * @param  string  $keyword
     * @return array
     */
    public function find_likes($keyword)
    {
        if ($keyword)
        {
            return (array) DB::select('mem.email', 'mem.nickname')
                ->from(array('members', 'mem'))
                ->join(array('managers', 'man'), 'LEFT')
                ->on('mem.member_id', '=', 'man.member_id')
                ->where_open()
                ->or_where('mem.email', 'LIKE', "%$keyword%")
                ->or_where('mem.nickname', 'LIKE', "%$keyword%")
                ->where_close()
                ->where('man.role_id', '', DB::expr('IS NULL'))
                ->limit(15)
                ->order_by('mem.member_id', 'ASC')
                ->fetch_all();
        }
        return array();
    }


}